package com.sojson.config.filter;

import java.io.IOException;
import java.util.HashSet;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.sojson.util.StringUtil;
import com.sojson.util.token.Token;
import com.sojson.util.token.TokenUtil;
import com.sojson.util.token.interfaces.TokenFilterInterface;

/**
 * Token过滤器
 *
 * @author liu
 * @date 2020-11-02
 */
public class TokenFilter extends TokenFilterInterface {

    /** 不过滤的路径 */
    private HashSet<String> excludePath;

    /**
     * 从请求头中获取Token并保存到请求域中
     * (因为有时候前端没有传Token(第一次访问的时候),
     * 而后端为了统一管理,每次返回响应之前都会获取请求头并放入到响应头中,
     * 但是有时候前端没有传Token,但是用户点击登录后,后台会创建一个Token,
     * 而Token不能存到请求头中(请求头只能前端传),所以就存到请求域中)
     */
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
        throws ServletException, IOException {

        // 获取Token并将Token字符串保存到响应头
        Token token = TokenUtil.getToken();
        // 如果Token是空就结束
        if (isBlankObject(token)) {
            chain.doFilter(request, response);
            return;
        }

        // 验证并更新Token
        verifyRefreshToken(token);

        chain.doFilter(request, response);
    }

    /**
     * 判断一个对象是否是空(空对象)
     *
     * @param obj
     * @return
     */
    private boolean isBlankObject(Object obj) {
        return StringUtil.isBlankObject(obj);
    }

    /**
     * 验证并更新Token
     *
     * @param token 令牌
     * @throws IOException
     */
    private boolean verifyRefreshToken(Token token) throws IOException {
        return TokenUtil.verifyRefreshToken(token);
    }

    /**
     * 获取不过滤的路径
     *
     * @return
     */
    @Override
    public HashSet<String> getExcludePath() {
        return this.excludePath;
    }

    /**
     * 设置不过滤的路径
     *
     * @param excludePath
     */
    @Override
    public void setExcludePath(HashSet<String> excludePath) {
        this.excludePath = excludePath;
    }

    /**
     * 获取当前过滤器的名字
     */
    @Override
    public String getName() {
        String name = "token";
        return name;
    }

}